package com.swdegao.iot.netty.service.impl;

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

import com.swdegao.iot.netty.server.guoxinhandler.ConstGuoXin;
import com.swdegao.iot.netty.server.qianbaotonghandler.QianBaoTong_Const;
import com.swdegao.iot.netty.server.qianbaotongplushandler.QianBaoTongPlus_Const;
import com.swdegao.iot.netty.server.silianhandler.SiLian_Const;
import com.swdegao.iot.netty.utils.ExceptionUitls;
import org.apache.http.ParseException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestParam;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.swdegao.iot.netty.utils.RedisUtils;
import com.swdegao.iot.netty.utils.SendUtil;
import io.netty.channel.Channel;
import io.swagger.annotations.ApiParam;

import com.swdegao.iot.netty.entity.ImeiInfo;
import com.swdegao.iot.netty.entity.Parameter;
import com.swdegao.iot.netty.entity.PresetCommand;
import com.swdegao.iot.netty.utils.Const;
import com.swdegao.iot.netty.service.CMDService;

@Service
public class CMDServiceImpl implements CMDService {

	//定义一个全局的记录器，通过LoggerFactory获取
    private final static Logger logger = LoggerFactory.getLogger(CMDServiceImpl.class);

	@Autowired
	private RedisUtils redisUtils;
	/**
	 * 预置命令处理
	 */
	@Override
	public JSONObject waitingPresetCommand(String imei,String  data)throws ParseException, Exception {
		JSONObject object = new JSONObject();
		String downDataId = UUID.randomUUID().toString();//随机UUID
		PresetCommand presetCommand = new PresetCommand();
		presetCommand.setDownDataId(downDataId);
		presetCommand.setNum("0");
		presetCommand.setStatus("0");
		presetCommand.setDownData(data);
		presetCommand.setCreatetime(System.currentTimeMillis());
		redisUtils.lPush(imei+Parameter.imei_waitingpresetcommand, JSON.toJSONString(presetCommand));//添加到imei_waitingpresetcommand
		object.put("status", 0);
		object.put("downDataId", downDataId);
		return object;
	}

	@Override
	public JSONObject commandIssued(String imei, String data,String communicationType) throws ParseException, Exception {
		logger.info("设备IMEI：{}，通讯类型：{}",imei,communicationType);
		// 返回的jsonObject
		JSONObject object = new JSONObject();

		// 获取imei对应的设备总数(从redis)
		boolean count = redisUtils.hmhave(Parameter.imei_info, imei);

		// 1、对imei的身份进行验证，查看数据库是否存在该设备 ：false 直接返回
		if (!count) {
			object.put("status", 0);
			//logger.info("返回值：" + object.toString());
			return object;
		} else {
			// 2、redis根据imei生成requestID，并将数据存储在redis中
			String requestID = UUID.randomUUID().toString();//随机UUID


			// 组装json格式数据
			JSONObject oj = new JSONObject();
			oj.put("dataId", requestID);
			oj.put("imei", imei);
			oj.put("createtime", System.currentTimeMillis());
			oj.put("downData", data);
			// 保存到redis
			redisUtils.lPush(imei + Parameter.imei_info_downdata, oj.toString());

			// 并且更新redis缓存中 imei_info imei对应的downdataId值（存requestID）和requestLastTime值
			ImeiInfo imeiInfo = JSON.parseObject(redisUtils.hmGet(Parameter.imei_info, imei).toString(),
					ImeiInfo.class);
			imeiInfo.setDownDataId(requestID);
			imeiInfo.setRequestLastTime(System.currentTimeMillis());
			redisUtils.hmSet(Parameter.imei_info, imei, JSON.toJSONString(imeiInfo));

			// 3、调用Netty的API接口，查看imei所在的Map<imei,channel>,判断设备是否在线，flase：直接返回
			String status = "";
			Channel channel = null;
			switch (communicationType){
				case "1"://GuoXin-TCP 国信集中器
					status = ConstGuoXin.getChannelStatus(imei);
					channel = ConstGuoXin.get(imei);
					break;
				case "2"://SiLian-TCP 四联集中器
					status = SiLian_Const.getChannelStatus(imei);
					channel = SiLian_Const.get(imei);
					break;
				case "4"://DeGao-TCP 德高大表
					status = Const.getChannelStatus(imei);
					channel = Const.get(imei);
					break;
				case "5"://QianBaoTong-TCP 千宝通集中器
					status = QianBaoTongPlus_Const.getChannelStatus(imei);
					channel = QianBaoTongPlus_Const.get(imei);
					break;

			}

			logger.info("imei "  + imei + ",status:" + status);
			try {
				if (status.equals("1")) {
					// 4、调用Netty的数据发送接口

					SendUtil sendUtil = new SendUtil();
					//Channel channel = Const.get(imei);
					if (channel != null && channel.isActive() && data != null && !"".equals(data)) {
						if (sendUtil.send(imei, channel, data)) {

							object.put("status", 1);
							object.put("requestId", requestID);
						} else {
							object.put("status", 0);
							object.put("requestId", requestID);
						}
					}
					logger.info("返回值：" + object.toString());
					return object;
				} else if (status.equals("0")) {
					object.put("status", 0);
					object.put("requestId", requestID);
					logger.info("返回值：" + object.toString());
					return object;
				} else {
					object.put("status", 2);
					object.put("requestId", requestID);
					logger.info("返回值：" + object.toString());
					return object;
				}
			}catch (Exception e){
				logger.error(imei +" 异常:" + ExceptionUitls.getExceptionInfo(e));
				object.put("status", 2);
				object.put("requestId", requestID);
				return object;
			}
		}
	}

//	备份
//	@Override
//	public JSONObject commandIssued(String imei, String data) throws ParseException, Exception {
//		// 返回的jsonObject
//		JSONObject object = new JSONObject();
//
//		// 获取imei对应的设备总数(从redis)
//		boolean count = redisUtils.hmhave(Parameter.imei_info, imei);
//
//		// 1、对imei的身份进行验证，查看数据库是否存在该设备 ：false 直接返回
//		if (!count) {
//			object.put("status", 0);
//			//logger.info("返回值：" + object.toString());
//			return object;
//		} else {
//			// 2、redis根据imei生成requestID，并将数据存储在redis中
//			String requestID = UUID.randomUUID().toString();//随机UUID
//			//logger.info("请求ID>>>>" + requestID);
//			// 组装json格式数据
//			JSONObject oj = new JSONObject();
//			oj.put("dataId", requestID);
//			oj.put("imei", imei);
//			oj.put("createtime", System.currentTimeMillis());
//			oj.put("downData", data);
//			// 保存到redis
//			redisUtils.lPush(imei + Parameter.imei_info_downdata, oj.toString());
//
//			// 并且更新redis缓存中 imei_info imei对应的downdataId值（存requestID）和requestLastTime值
//			ImeiInfo imeiInfo = JSON.parseObject(redisUtils.hmGet(Parameter.imei_info, imei).toString(),
//					ImeiInfo.class);
//			imeiInfo.setDownDataId(requestID);
//			imeiInfo.setRequestLastTime(System.currentTimeMillis());
//			redisUtils.hmSet(Parameter.imei_info, imei, JSON.toJSONString(imeiInfo));
//
//			// 3、调用Netty的API接口，查看imei所在的Map<imei,channel>,判断设备是否在线，flase：直接返回
//			String status = Const.getChannelStatus(imei);
//
//			if (status.equals("1")) {
//				// 4、调用Netty的数据发送接口
//
//				SendUtil sendUtil = new SendUtil();
//				Channel channel = Const.get(imei);
//				if (channel != null && channel.isActive() && data != null && !"".equals(data)) {
//					if (sendUtil.send(imei, channel, data)) {
//
//						object.put("status", 1);
//						object.put("requestId", requestID);
//						//logger.info("返回值：" + object.toString());
//					} else {
//						object.put("status", 0);
//						object.put("requestId", requestID);
//						//logger.info("返回值：" + object.toString());
//					}
//				}
//				return object;
//			} else if (status.equals("0")) {
//				object.put("status", 0);
//				object.put("requestId", requestID);
//				//logger.info("返回值：" + object.toString());
//				return object;
//			} else {
//				object.put("status", 2);
//				object.put("requestId", requestID);
//				//logger.info("返回值：" + object.toString());
//				return object;
//			}
//		}
//	}

	@Override
	public List<JSONObject> commandResponse(String imei, String requestID) {
		//logger.info("参数："+imei +":参数" + requestID);
		//返回的jsonObject
		JSONObject object = new JSONObject();
		List<JSONObject> objectList = new ArrayList<JSONObject>();

		//1、验证Imei的身份，从redis查看是否存在requestID,false:直接返回
//		ImeiInfo imeiInfo = JSON.parseObject(redisUtils.hmGet(Parameter.imei_info,imei).toString(), ImeiInfo.class);
//		String downdataID = imeiInfo.getDownDataId();

		//2、查询redis中key为imei值的value（list结构）数据(命令响应数据)，做pop操作
		int length = redisUtils.getLength(imei+"_"+ requestID + Parameter.imei_info_requestdata);
		for(int i = 0; i<length; i++) {
			objectList.add((JSONObject)JSON.parse(redisUtils.getValueByKey(imei+"_"+ requestID + Parameter.imei_info_requestdata).toString()));
		}

		//3、将数据返回：json格式
		return objectList;


//		if(downdataID.equals(requestID)){//取消UUID匹配判断
//		}else {
//
//			object.put("status", 5);
//			object.put("requestId", requestID);
//			objectList.add(object);
//			logger.info("返回值：" +object.toString());
//			return objectList;
//		}
	}

}
